/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */
package jp.ize.ux.components;

// {{{ imports
import jp.ize.ux.UXController;
import jp.ize.ux.acts.Act;
import jp.ize.ux.states.UXBasicState;
import jp.ize.ux.utils.UXRange;
import jp.ize.ux.events.UXMouseEvent;
import jp.ize.ux.components.UXTextField;
import jp.ize.ux.interactions.UXGeneralInteraction;
#if flash9
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
#end
// }}}
// {{{ typedef LabelColors
typedef LabelColors =
{
	normal:Int,
	highlight:Int,
	focus:Int,
	select:Int,
	press:Int,
	disable:Int
}
// }}}
// {{{ class UXLabelAct extends Act
/**
 * UXLabelAct クラス<br>
 * UXLabelのデフォルトアクションです。
 */
class UXLabelAct extends Act
{
	// {{{ public function new()
	/**
	 * コンストラクタです。<br>
	 */
	public function new()
	{
		super();
	}
	// }}}
	// {{{ public function normal() : UXLabelState->Void
	/**
	 * ラベルが実行された時のデフォルトアクションです。
	 */
	public function normal() : UXLabelState->Void
	{
		return function (s:UXLabelState) {
			if ( s.highlighted ) {
				s.textfield.textColor = s.colors.highlight;
				s.resource.highlighted();
			} else {
				s.textfield.textColor = s.colors.normal;
				s.resource.normal();
			}
		}
	}
	// }}}
	// {{{ public function highlight() : UXLabelState->Void
	/**
	 * ラベルをハイライトした時のデフォルトアクションです。
	 */
	public function highlight() : UXLabelState->Void
	{
		return function (s:UXLabelState) {
			s.highlighted = true;
			s.textfield.textColor = s.colors.highlight;
			s.resource.highlighted();
		}
	}
	// }}}
	// {{{ public function unhighlight() : UXLabelState->Void
	/**
	 * ラベルをハイライトした時のデフォルトアクションです。
	 */
	public function unhighlight() : UXLabelState->Void
	{
		return function (s:UXLabelState) {
			s.highlighted = false;
			s.textfield.textColor = s.colors.normal;
			s.resource.normal();
		}
	}
	// }}}
	// {{{ public function enable() : UXLabelState->Void
	/**
	 * 有効にした時のデフォルトアクションです。
	 */
	public function enable() : UXLabelState->Void
	{
		return function (s:UXLabelState) {
			s.textfield.textColor = s.colors.normal;
			s.resource.normal();
		}
	}
	// }}}
	// {{{ public function disable() : UXLabelState->Void
	/**
	 * 無効にした時のデフォルトアクションです。
	 */
	public function disable() : UXLabelState->Void
	{
		return function (s:UXLabelState) {
			s.textfield.textColor = s.colors.disable;
			s.resource.disabled();
		}
	}
	// }}}
	// {{{ public function show() : UXLabelState->Void
	/**
	 * 表示された時のデフォルトアクションです。
	 */
	public function show() : UXLabelState->Void
	{
		return function (s:UXLabelState) {
			s.target.visible = true;
		}
	}
	// }}}
	// {{{ public function hide() : UXLabelState->Void
	/**
	 * 非表示になった時のデフォルトアクションdす。
	 */
	public function hide() : UXLabelState->Void
	{
		return function (s:UXLabelState) {
			s.target.visible = false;
		}
	}
	// }}}
}
// }}}
// {{{ class UXLabelState
/**
 * UXLabelState クラス<br>
 * UXLabelの現在の状態を表すオブジェクトです。
 */
//class UXLabelState extends UXListState
class UXLabelState extends UXListState
{
	// {{{ public var textfield( default, default ) : TextField;
	/**
	 * ラベルのテキストフィールドです。
	 */
	public var textfield( default, default ) : TextField;
	// }}}
	// {{{ public var colors( default, default ) : LabelColors;
	/**
	 * ラベルの状態に対する色の設定です。
	 */
	public var colors( default, default ) : LabelColors;
	// }}}
	// {{{ public var resource( default, default ) : UXLabelResource;
	/**
	 * ラベルの描画に使用するリソースです。
	 */
	public var resource( default, default ) : UXComponentResource;
	// }}}
	// {{{ public var acts(default, null) : UXLabelAct
	/**
	 * デフォルトのラベルの動きです。
	 */
	public var acts(default, null) : UXLabelAct;
	// }}}
	// {{{ public function new( ?lbl:TextField, ?res:UXComponentResource ) : Void
	/**
	 * コンストラクタです。
	 *
	 * @param lbl:テキストフィールドを指定します。
	 * @param res:背景リソース等のリソースを指定します。
	 */
	public function new( ?lbl:TextField, ?res:UXComponentResource ) : Void
	{
		super();
		if ( res==null ) res = new UXComponentResource();
		resource  = res;
		textfield = lbl;
		acts      = new UXLabelAct();
		highlighted = false;
		if ( resource!=null ) {
			resource.normal();
		}
	}
	// }}}
}
// }}}

// {{{ class UXLabel extends UXComponent<UXLabelState>
/** 
 * UXLabel クラス<br>
 * テキスト表示用のクラスです。<br>
 *
 * @author		iZE Co., Ltd.<br>
 * @version		$Id: UXLabel.hx 20 2009-02-04 08:23:19Z yimai.v $<br>
 */
class UXLabel extends UXComponent<UXLabelState>
{
	// {{{ properties

	public var label : TextField;

	// }}}
	// {{{ public var text(getText, setText) : String;
	/**
	 * テキストフィールド内の現在のテキストを示します。
	 */
	public var text(getText, setText) : String;
	// }}}
	// {{{ public var textColor(getTextColor, setTextColor) : Int;
	/**
	 * テキストフィールド内の現在のテキストカラーを示します。
	 */
	public var textColor(getTextColor, setTextColor) : Int;
	// }}}
	// {{{ public var selection(default, default) : UXRange;
	/**
	 * テキストの現在の選択範囲を示します。
	 */
	public var selection(getSelection, setSelection) : UXRange;
	// }}}
	// {{{ public function new( ?text:String="", ?size:Int, ?color:Int )
	/**
	* UXLabelのコンストラクタです。
	* 引数で与えられた文字列のラベルを生成します。
	* size はフォントサイズです。
	* color は文字列の色です。
	*/
	public function new( ?text:String="", ?size:Int, ?color:Int ) : Void
	{
		label = new TextField();
		//label.mouseEnabled = true;
		label.mouseWheelEnabled = true;
		label.type = TextFieldType.DYNAMIC;
		if ( size!=null ) {
			var fm:TextFormat = new TextFormat();
			fm.size = size;
			label.defaultTextFormat = fm;
		}
		if ( color!=null ) {
			label.textColor = color;
		}
		label.text = text;
		label.selectable = false;
		label.autoSize = TextFieldAutoSize.LEFT;

		state = new UXLabelState(label);
		state.target = this;
		state.colors = {
			normal:    0x000000,
			highlight: 0x0000FF,
			focus:     0x000000,
			select:    0xFFFF00,
			press:     0xAAAAAA,
			disable:   0xCCCCCC
		}

		ctrl = new UXController<UXLabelState>( state );
		ctrl.addInteraction( new UXLabelClickInteraction() );
		ctrl.addInteraction( new UXLabelRollOverInteraction() );
		ctrl.addInteraction( new UXLabelRollOutInteraction() );
		super(ctrl);
		addChild( label );
		ctrl.addUXChild(this);

		ctrl.getInteraction("Click").addReactEvent(UXMouseEvent.CLICK);
		ctrl.getInteraction("RollOver").addReactEvent(UXMouseEvent.ROLL_OVER);
		ctrl.getInteraction("RollOut").addReactEvent(UXMouseEvent.ROLL_OUT);

		//ctrl.getInteraction("RollOver").addAct(state.act.highlight());
		//ctrl.getInteraction("RollOut").addAct(state.act.unhighlight());
	}
	// }}}
	// {{{ public function getText() : String
	/**
	 * 表示しているテキストを返します。
	 */
	public function getText() : String
	{
		return label.text;
	}
	// }}}
	// {{{ public function setText( s : String ) : String
	/**
	 * 表示するテキストを設定します。
	 */
	public function setText( s : String ) : String
	{
		return label.text = s;
	}
	// }}}
	// {{{ public function getTextColor() : Int
	/**
	 * 表示しているテキストを返します。
	 */
	public function getTextColor() : Int
	{
		return label.textColor;
	}
	// }}}
	// {{{ public function setTextColor( s : Int ) : Int
	/**
	 * 表示するテキストを設定します。
	 */
	public function setTextColor( c : Int ) : Int
	{
		return label.textColor = c;
	}
	// }}}
	// {{{ public function getSelection() : UXRange
	/**
	 * 選択範囲を返します。　
	 */
	public function getSelection() : UXRange
	{
		return new UXRange( label.selectionBeginIndex, label.selectionEndIndex );
	}
	// }}}
	// {{{ public function setSelection( selection : UXRange ) : UXRange
	/**
	 * 選択範囲を設定します。
	 */
	public function setSelection( selection : UXRange ) : UXRange
	{
		label.setSelection( Std.int(selection.min), Std.int(selection.max) );
		return selection;
	}
	// }}}
	// {{{ public function getSize() : Float
	/**
	 * 表示しているフォントサイズを返します。
	 */
	public function getSize() : Float
	{
		var fm = label.getTextFormat();
		return fm.size;
	}
	// }}}
	// {{{ public function setSize( s : Float ) : Float
	/**
	 * 表示するフォントサイズを設定します。
	 */
	public function setSize( s : Float ) : Float
	{
		var fm = label.getTextFormat();
		return fm.size = s;
	}
	// }}}
	// {{{ public function getBold() : Bool
	/**
	 * 表示しているボールド状態を返します。
	 */
	public function getBold() : Bool
	{
		var fm = label.getTextFormat();
		return fm.bold;
	}
	// }}}
	// {{{ public function setBold( s : Bool ) : Bool
	/**
	 * 表示するボールド状態を設定します。
	 */
	public function setBold( s : Bool ) : Bool
	{
		var fm = label.getTextFormat();
		return fm.bold = s;
	}
	// }}}
	// {{{ public function getItalic() : Bool
	/**
	 * 表示しているイタリック状態を返します。
	 */
	public function getItalic() : Bool
	{
		var fm = label.getTextFormat();
		return fm.italic;
	}
	// }}}
	// {{{ public function setItalic( s : Bool ) : Bool
	/**
	 * 表示するイタリック状態を設定します。
	 */
	public function setItalic( s : Bool ) : Bool
	{
		var fm = label.getTextFormat();
		return fm.italic = s;
	}
	// }}}
	// {{{ public function getUnderline() : Bool
	/**
	 * 表示しているアンダーライン状態を返します。
	 */
	public function getUnderline() : Bool
	{
		var fm = label.getTextFormat();
		return fm.underline;
	}
	// }}}
	// {{{ public function setUnderline( s : Bool ) : Bool
	/**
	 * 表示するアンダーライン状態を設定します。
	 */
	public function setUnderline( s : Bool ) : Bool
	{
		var fm = label.getTextFormat();
		return fm.underline = s;
	}
	// }}}
	// {{{ public function getAlign() : UXTextAlign
	/**
	 * 表示しているアライン状態を返します。
	 */
	public function getAlign() : UXTextAlign
	{
		var fm = label.getTextFormat();
		var align = null;
		switch ( fm.align ) {
			case TextFormatAlign.CENTER:
				align = CENTER;
			case TextFormatAlign.JUSTIFY:
				align = JUSTIFY;
			case TextFormatAlign.LEFT:
				align = LEFT;
			case TextFormatAlign.RIGHT:
				align = RIGHT;
		}
		return align;
	}
	// }}}
	// {{{ public function setAlign( s : UXTextAlign ) : UXTextAlign
	/**
	 * 表示するアライン状態を設定します。
	 */
	public function setAlign( s : UXTextAlign ) : UXTextAlign
	{
		var fm = label.getTextFormat();
		switch ( s ) {
			case CENTER:
				fm.align = TextFormatAlign.CENTER;
			case JUSTIFY:
				fm.align = TextFormatAlign.JUSTIFY;
			case LEFT:
				fm.align = TextFormatAlign.LEFT;
			case RIGHT:
				fm.align = TextFormatAlign.RIGHT;
		}
		return s;
	}
	// }}}
	// {{{ public function setTextColors( c:LabelColors ) : Void
	/**
	* 状態によって変化させるカラーを設定します。
	*/
	public function setTextColors( c:LabelColors ) : Void
	{
		state.colors = c;
	}

	// }}}
	// {{{ public function addUXEventListener( e:Dynamic, f:Dynamic->Void ) : Void
	/**
	* イベントリスナーを追加します。
	*/
	override public function addUXEventListener( e:Dynamic, f:Dynamic->Void ) : Void
	{
		addEventListener( e, f, false, 0, true );
		label.addEventListener( e, f, false, 0, true );
	}

	// }}}
	// {{{ public function removeUXEventListener( e:Dynamic, f:Dynamic->Void ) : Void
	/**
	* イベントリスナーを削除します。
	*/
	override public function removeUXEventListener( e:Dynamic, f:Dynamic->Void ) : Void
	{
		removeEventListener( e, f );
		label.removeEventListener( e, f );
	}

	// }}}
}
// }}}

// {{{ class UXLabelClickInteraction extends UXGeneralInteraction<UXLabelState>
/**
 * UXLabelClickInteraction クラス<br>
 * ラベルの実行に対するデフォルトインタラクションです。
 */
class UXLabelClickInteraction extends UXGeneralInteraction<UXLabelState>
{
	// {{{ public function new() : Void
	/**
	* コンストラクタ
	*/
	public function new() : Void
	{
		super("Click");
	}

	// }}}
}
// }}}
// {{{ class UXLabelRollOverInteraction extends UXGeneralInteraction<UXLabelState>
/**
 * UXLabelRollOverInteraction クラス<br>
 * ラベルの実行に対するデフォルトインタラクションです。
 */
class UXLabelRollOverInteraction extends UXGeneralInteraction<UXLabelState>
{
	// {{{ public function new() : Void
	/**
	* コンストラクタ
	*/
	public function new() : Void
	{
		super("RollOver");
	}

	// }}}
}
// }}}
// {{{ class UXLabelRollOutInteraction extends UXGeneralInteraction<UXLabelState>
/**
 * UXLabelRollOutInteraction クラス<br>
 * ラベルの実行に対するデフォルトインタラクションです。
 */
class UXLabelRollOutInteraction extends UXGeneralInteraction<UXLabelState>
{
	// {{{ public function new() : Void
	/**
	* コンストラクタ
	*/
	public function new() : Void
	{
		super("RollOut");
	}

	// }}}
}
// }}}
